package com.cskaoyan.basic._2variable._3notice;

/**
 * 浮点数的精度问题
 * 浮点数之所以存在精度问题，主要有两个原因:
 *      1.浮点数自身的原因，有效位数是有限的
 *          float有效位数是7~8位
 *          double有效位数是16~17位
 *      2.二进制小数存在无限循环的情况，和十进制小数类似。
 *
 * 这里涉及一个二进制表示小数的转换问题，规则如下：
 * 十进制正小数（0.开头）转换成二进制，先用小数部分乘以2，取结果的整数部分(必然是1或者0)，
 * 然后小数部分继续乘2
 * 直到小数部分为0，或者已经达到了最大的位数
 * 最终的结果（0.开头）正序排列
 *
 * 比如0.1十进制小数转换成二进制
 * 0.1 * 2 = 0.2 --> 0
 * 0.2 * 2 = 0.4 --> 0
 * 0.4 * 2 = 0.8 --> 0
 * 0.8 * 2 = 1.6 --> 1
 * 0.6 * 2 = 1.2 --> 1
 * 0.2 * 2 = 0.4 --> 0
 * ....
 *
 * 以上0.1转换成二进制小数是一个无限循环小数
 *
 * 所以浮点数在很多情况下，是不能准确表示一个数字的。
 *
 *
 * @since 09:32
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        double a = 1 - 0.9;
        float b = 1 - 0.9F;
        System.out.println(a);
        System.out.println(b);

        float c = 0.1F;
        double d = 0.1;
        System.out.println(c == d);

        float a1 = 0.1F;
        // 中间18个0
        float b1 = 0.10000000000000000001F;
        System.out.println(a1 == b1);
    }
}
